//package com.hww.common.util;
//
//import java.lang.reflect.AccessibleObject;
//import java.lang.reflect.Constructor;
//import java.lang.reflect.Field;
//import java.lang.reflect.Method;
//import java.util.HashSet;
//import java.util.Set;
//
///**
// * 反射工具类
// *
// * @author Looly
// * @since 3.0.9
// */
//public class ReflectUtil {
//
//
//    // --------------------------------------------------------------------------------------------------------- Constructor
//
//    /**
//     * 获得一个类中所有字段列表，直接反射获取，无缓存
//     *
//     * @param beanClass 类
//     * @return 字段列表
//     * @throws SecurityException 安全检查异常
//     */
//    public static Constructor<?>[] getConstructorsDirectly(Class<?> beanClass) throws SecurityException {
//        if (null == beanClass) {
//            throw new NullPointerException("this String argument must have length; it must not be null or empty");
//        }
//        return beanClass.getDeclaredConstructors();
//    }
//
//    // --------------------------------------------------------------------------------------------------------- Field
//
//    /**
//     * 获取静态字段值
//     *
//     * @param field 字段
//     * @return 字段值
//     * @throws UtilException 包装IllegalAccessException异常
//     * @since 5.1.0
//     */
//    public static Object getStaticFieldValue(Field field) throws UtilException {
//        return getFieldValue(null, field);
//    }
//
//    /**
//     * 获取字段值
//     *
//     * @param obj   对象，static字段则此字段为null
//     * @param field 字段
//     * @return 字段值
//     * @throws UtilException 包装IllegalAccessException异常
//     */
//    public static Object getFieldValue(Object obj, Field field) throws UtilException {
//        if (null == field) {
//            return null;
//        }
//        if (obj instanceof Class) {
//            // 静态字段获取时对象为null
//            obj = null;
//        }
//
//        setAccessible(field);
//        Object result;
//        try {
//            result = field.get(obj);
//        } catch (IllegalAccessException e) {
//            throw new UtilException(e, "IllegalAccess for {}.{}", field.getDeclaringClass(), field.getName());
//        }
//        return result;
//    }
//
//    // --------------------------------------------------------------------------------------------------------- method
//
//    /**
//     * 获得本类及其父类所有Public方法
//     *
//     * @param clazz 查找方法的类
//     * @return 过滤后的方法列表
//     */
//    public static Method[] getPublicMethods(Class<?> clazz) {
//        return null == clazz ? null : clazz.getMethods();
//    }
//
//    /**
//     * 查找指定Public方法 如果找不到对应的方法或方法不为public的则返回<code>null</code>
//     *
//     * @param clazz      类
//     * @param methodName 方法名
//     * @param paramTypes 参数类型
//     * @return 方法
//     * @throws SecurityException 无权访问抛出异常
//     */
//    public static Method getPublicMethod(Class<?> clazz, String methodName, Class<?>... paramTypes) throws SecurityException {
//        try {
//            return clazz.getMethod(methodName, paramTypes);
//        } catch (NoSuchMethodException ex) {
//            return null;
//        }
//    }
//
//
//    /**
//     * 获得指定类中的Public方法名<br>
//     * 去重重载的方法
//     *
//     * @param clazz 类
//     * @return 方法名Set
//     * @throws SecurityException 安全异常
//     */
//    public static Set<String> getMethodNames(Class<?> clazz) throws SecurityException {
//        final HashSet<String> methodSet = new HashSet<>();
//        final Method[] methods = getMethods(clazz);
//        for (Method method : methods) {
//            methodSet.add(method.getName());
//        }
//        return methodSet;
//    }
//
//    /**
//     * 是否为equals方法
//     *
//     * @param method 方法
//     * @return 是否为equals方法
//     */
//    public static boolean isEqualsMethod(Method method) {
//        if (method == null || false == "equals".equals(method.getName())) {
//            return false;
//        }
//        final Class<?>[] paramTypes = method.getParameterTypes();
//        return (1 == paramTypes.length && paramTypes[0] == Object.class);
//    }
//
//    /**
//     * 是否为hashCode方法
//     *
//     * @param method 方法
//     * @return 是否为hashCode方法
//     */
//    public static boolean isHashCodeMethod(Method method) {
//        return method != null//
//                && "hashCode".equals(method.getName())//
//                && isEmptyParam(method);
//    }
//
//    /**
//     * 是否为toString方法
//     *
//     * @param method 方法
//     * @return 是否为toString方法
//     */
//    public static boolean isToStringMethod(Method method) {
//        return method != null//
//                && "toString".equals(method.getName())//
//                && isEmptyParam(method);
//    }
//
//    /**
//     * 是否为无参数方法
//     *
//     * @param method 方法
//     * @return 是否为无参数方法
//     * @since 5.1.1
//     */
//    public static boolean isEmptyParam(Method method) {
//        return method.getParameterTypes().length == 0;
//    }
//
//    // --------------------------------------------------------------------------------------------------------- newInstance
//
//    /**
//     * 实例化对象
//     *
//     * @param <T>   对象类型
//     * @param clazz 类名
//     * @return 对象
//     * @throws UtilException 包装各类异常
//     */
//    @SuppressWarnings("unchecked")
//    public static <T> T newInstance(String clazz) throws UtilException {
//        try {
//            return (T) Class.forName(clazz).newInstance();
//        } catch (Exception e) {
//            throw new UtilException(e, "Instance class [{}] error!", clazz);
//        }
//    }
//
//    // --------------------------------------------------------------------------------------------------------- invoke
//
//    /**
//     * 设置方法为可访问（私有方法可以被外部调用）
//     *
//     * @param <T>              AccessibleObject的子类，比如Class、Method、Field等
//     * @param accessibleObject 可设置访问权限的对象，比如Class、Method、Field等
//     * @return 被设置可访问的对象
//     * @since 4.6.8
//     */
//    public static <T extends AccessibleObject> T setAccessible(T accessibleObject) {
//        if (null != accessibleObject && false == accessibleObject.isAccessible()) {
//            accessibleObject.setAccessible(true);
//        }
//        return accessibleObject;
//    }
//}
